<?php
//Clase creada para manejar documentos XML que tengan el formato de una consulta a una base de datos
class ConsultaXML extends XMLWriter{
//Función que inicializa el documento XML, establece el contenido de su encabezado y abre el elemento raíz
    function iniciaDocumento($elementoRaiz = "consulta", $version = "1.0", $juegoDeCarateres = "UTF-8") {
        $this->openMemory();
        $this->setIndent(true);
        $this->setIndentString(" ");
        $this->startDocument($version,$juegosDeCaracteres);    
        $this->startElement($elementoRaiz);
    }
/*
 * Método que crea el elemento Campo dentro del documento, recibiendo como parámetros el nombre del campo
 * y el valor que contendrá.
 */
    public function creaCampo($nombreDelCampo, $valor) {
        $this->startElement("campo");
        $this->writeAttribute("nombre",$nombreDelCampo);
        $this->text($valor);
        $this->endElement();
    }
/*
 * Método que crea el elemento Registro dentro del documento, recibiendo como parámetros el arreglo asociativo
 * que contendrá los nombres y valores de los campos que poseerá el registro, junto con el identificaor del
 * registro que será almacenado en su atributo "id".
 */
    public function creaRegistroDesdeArreglo($arreglo, $idRegistro) {
     $this->startElement("registro");
     $this->writeAttribute("codigo",$idRegistro);
        if(is_array($arreglo)){
            foreach ($arreglo as $llave => $valor){
                $this->creaCampo($llave, $valor);
            }
        }
        $this->endElement();
    }
    /*
 * Método que crea el elemento Tabla dentro del documento, recibiendo como parámetros una matriz de arreglos
 * asociativos, el nombre de la tabla y el nombre del campo que identificará a los registros que contendrá la
 * tabla. Dentro de un ciclo se llamará a al método creaRegistro para cada uno de los arreglos asociativos
 * que contenga la raíz, de esta forma se creará un documento XML que contenga todos los registros de una
 * tabla obtenida en una consulta.  
 */
    public function creaTablaDesdeMatriz($matriz, $nombreDeLaTabla, $campoIdRegistro) {
        $this->startElement("tabla");
        $this->writeAttribute("nombre",$nombreDeLaTabla);
        if(is_array($matriz) && gettype($campoIdRegistro)=="string"){
            foreach ($matriz as $llave => $renglon){
                if($campoIdRegistro == "")
                   $this->creaRegistroDesdeArreglo($renglon, $llave);
                else
                   $this->creaRegistroDesdeArreglo($renglon, $renglon[$campoIdRegistro]);
            }
        }
        $this->endElement();
    }

    //Cierra el elemento raíz y finaliza el documento, regresando además el contenido del documento actual.
    public function finalizaDocumento(){
        $this->endElement();
        $this->endDocument();
        return $this->outputMemory();
    }

    /**
     * Establece que el programa PHP actual generará como salida un archivo XML y envía a esta la salida el contenido del
     * documento creado.
     */
    public function salida(){
        header('Content-type: text/xml');
        echo $this->finalizaDocumento();
    }
}
?>
